//
//  DVCheckStringTypeTool.m
//  DoctorVideo
//
//  Created by 锦食送 on 2019/8/13.
//  Copyright © 2019 lzx. All rights reserved.
//

#import "DVCheckStringTypeTool.h"
#import <CommonCrypto/CommonCryptor.h>
@implementation DVCheckStringTypeTool
/**
 *  是否为手机号码（^1(3|5|7|8)\\d{9}）
 */
+ (BOOL)isMobilePhoneNumber:(NSString *)phoneNumber
{
    if (phoneNumber.length !=11) {
        return NO;
    }
    /**
     * 手机号码:
     * 13[0-9], 14[5,7], 15[0, 1, 2, 3, 5, 6, 7, 8, 9], 17[0, 1, 6, 7, 8], 18[0-9]
     * 移动号段: 134,135,136,137,138,139,147,150,151,152,157,158,159,170,178,182,183,184,187,188
     * 联通号段: 130,131,132,145,155,156,170,171,175,176,185,186
     * 电信号段: 133,149,153,170,173,177,180,181,189
     */
    NSString *MOBILE = @"^1(3[0-9]|4[57]|5[0-35-9]|7[0135678]|8[0-9])\\d{8}$";
    /**
     * 中国移动：China Mobile
     * 134,135,136,137,138,139,147,150,151,152,157,158,159,170,178,182,183,184,187,188
     */
    NSString *CM = @"^1(3[4-9]|4[7]|5[0-27-9]|7[08]|8[2-478])\\d{8}$";
    /**
     * 中国联通：China Unicom
     * 130,131,132,145,155,156,170,171,175,176,185,186
     */
    NSString *CU = @"^1(3[0-2]|4[5]|5[56]|7[0156]|8[56])\\d{8}$";
    /**
     * 中国电信：China Telecom
     * 133,149,153,170,173,177,180,181,189
     */
    NSString *CT = @"^1(3[3]|4[9]|53|7[037]|8[019])\\d{8}$";
    
    
    NSPredicate *regextestmobile = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", MOBILE];
    NSPredicate *regextestcm = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CM];
    NSPredicate *regextestcu = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CU];
    NSPredicate *regextestct = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CT];
    
    if (([regextestmobile evaluateWithObject:phoneNumber] == YES)
        || ([regextestcm evaluateWithObject:phoneNumber] == YES)
        || ([regextestct evaluateWithObject:phoneNumber] == YES)
        || ([regextestcu evaluateWithObject:phoneNumber] == YES))
    {
        return YES;
    }
    else
    {
        return NO;
    }
}

// 加密 对称加密需要传 跟后端定好的 一个 Key 和 一个 向量
+ (NSString *)encodeDesWithString:(NSString *)str
{
    NSString *const kInitVector = @"_Des_Iv_";
    NSString *const DESKey = @"_Des_key";
    NSData* data = [str dataUsingEncoding:NSUTF8StringEncoding];
    size_t plainTextBufferSize = [data length];
    const void *vplainText = (const void *)[data bytes];
    CCCryptorStatus ccStatus;
    uint8_t *bufferPtr = NULL;
    size_t bufferPtrSize = 0;
    size_t movedBytes = 0;
    bufferPtrSize = (plainTextBufferSize + kCCBlockSizeDES) & ~(kCCBlockSizeDES - 1);
    bufferPtr = malloc( bufferPtrSize * sizeof(uint8_t));
    memset((void *)bufferPtr, 0x0, bufferPtrSize);
    const void *vkey = (const void *) [DESKey UTF8String];
    const void *vinitVec = (const void *) [kInitVector UTF8String];
    ccStatus = CCCrypt(kCCEncrypt, kCCAlgorithmDES, kCCOptionPKCS7Padding, vkey, kCCKeySizeDES, vinitVec, vplainText,                       plainTextBufferSize,                       (void *)bufferPtr,                       bufferPtrSize,                       &movedBytes);    NSData *myData = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes];
    NSString *result = [myData base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
    return result;
}
// 解密
+ (NSString *)decodeDesWithString:(NSString *)str
{
    NSString *const kInitVector = @"_Des_Iv_";
    NSString *const DESKey = @"_Des_key";
    NSData *encryptData = [[NSData alloc] initWithBase64EncodedString:str options:NSDataBase64DecodingIgnoreUnknownCharacters];
    size_t plainTextBufferSize = [encryptData length];
    const void *vplainText = [encryptData bytes];
    CCCryptorStatus ccStatus;
    uint8_t *bufferPtr = NULL;
    size_t bufferPtrSize = 0;
    size_t movedBytes = 0;
    bufferPtrSize = (plainTextBufferSize + kCCBlockSizeDES) & ~(kCCBlockSizeDES - 1);
    bufferPtr = malloc( bufferPtrSize * sizeof(uint8_t));
    memset((void *)bufferPtr, 0x0, bufferPtrSize);
    const void *vkey = (const void *) [DESKey UTF8String];
    const void *vinitVec = (const void *) [kInitVector UTF8String];
    ccStatus = CCCrypt(kCCDecrypt,                           kCCAlgorithmDES,                           kCCOptionPKCS7Padding,                           vkey,                           kCCKeySizeDES,                           vinitVec,                           vplainText,                           plainTextBufferSize,                           (void *)bufferPtr,                           bufferPtrSize,                           &movedBytes);        NSString *result = [[NSString alloc] initWithData:[NSData dataWithBytes:(const void *)bufferPtr                                                                         length:(NSUInteger)movedBytes] encoding:NSUTF8StringEncoding];
    return result;
}

@end
